import express, { Application, Request, Response } from 'express';
import bodyParser from 'body-parser';
import { sendMsgToChatWindows } from '../main';
import { log } from './log';
import { Options } from './config';
import ServerStatus from './ServerStatus';

// 创建Express应用
const app: Application = express();

// 使用body-parser中间件解析JSON请求体
app.use(bodyParser.json());

class ApiServer {
    config: Options;
    constructor(cfg: Options) {
        this.config = cfg;
    }

    async start() {
        // 定义POST路由来处理图片地址
        app.post('/sendImage', async (req: Request, res: Response): Promise<void> => {
            try {
                log(this.config)
                if (this.config.groupList.length == 0) {
                    res.json({
                        status: 500,
                        message: '未配置群组',
                    });
                    return;
                }
                // 获取请求体中的图片地址和群组ID
                const { imagePath } = req.body;
                if (isUrl(imagePath)) {
                    // 错误处理
                    res.status(400).json({
                        status: 400,
                        message: 'Path格式错误',
                    });
                    return;
                }

                sendMsgToChatWindows('LiteLoader.SDWebUI_ImageQuickSend.sendImage', imagePath);

                // 返回成功响应
                res.status(201).json({
                    status: 200,
                    message: 'ok',
                });
            } catch (error: any) {
                // 错误处理
                res.status(400).json({
                    status: 400,
                    message: 'Failed to process request',
                    error: error.message,
                });
            }
        });

        const port = this.config.port;
        const server = app.listen(port, () => {
            ServerStatus.set('服务已启动');
            log(`服务已经启动，端口：${port}`);
        });

        server.on('error', (err: any) => {
            if (err.code === 'EADDRINUSE') {
                ServerStatus.set(`端口 ${port} 已被占用，请更换端口或关闭占用程序`);
                log(`端口 ${port} 已被占用，请更换端口或关闭占用程序`);
            } else {
                // 其他错误处理
                throw err;
            }
        });
    }
}

function isUrl(str: string) {
    const regex = /^(https?|ftp):\/\/((\d{1,3}\.){3}\d{1,3}|([\w-]+\.)+[\w-]+)(:\d+)?(\/[\w\-./?%&=]*)?$/;
    return regex.test(str);
}

export default ApiServer;